#define _CRT_SECURE_NO_WARNINGS 1

#include <iostream>
using namespace std;

//打印虚表
typedef void(*VF_T)();

class Person
{
public:
	Person(const string& name = string())
		:_name(name)
	{}

protected:
	string _name;
};

class Student : public Person
{
public:
	Student(const string& name = string())
		:Person(name)
	{}

	//子类继承抽象类后，需要重写纯虚函数，否则仍然是抽象类
	virtual void func() {};
};

void PrintVFTable(VF_T table[])	//也可以将参数类型设为 VF_T*
{
	//vs中在虚表的结尾处添加了 nullptr
	//如果运行失败，可以尝试清理解决方案重新编译
	int i = 0;
	while (table[i])
	{
		printf("[%d]:%p->", i, table[i]);
		VF_T f = table[i];
		f();	//调用函数，相当于 func()
		i++;
	}
	cout << endl;
}


int main()
{
	//提取出虚表指针，传递给打印函数
	Person p;
	Student s;

	//第一种方式：强转为虚函数地址（4字节）
	PrintVFTable((VF_T*)(*(int*)&p));
	PrintVFTable((VF_T*)(*(int*)&s));

	return 0;
}


